/**
 * 职责链类
 * @class Chain
 */
class Chain {
  /**
   *
   * @param {function} fn 职责任务函数
   * @param {object} 任务执行的上下文
   * @constructor
   */
  constructor (fn, context) {
    this.fn = fn
    this.context = context
    this.successor = null
  }
  /**
   *
   * 设置下一个接收者
   * @param {function} successor 接收者
   * @memberof Chain
   */
  setNextSuccessor (successor) {
    this.successor = successor
    return this.successor
  }
  /**
   * 执行任务，如果任务执行完毕后返回 `next`，则执行 next 方法，交由下一个接收者处理
   *
   * @returns
   * @memberof Chain
   */
  async start () {
    const ret = await this.fn.apply(this.context || this, arguments)
    if (ret === 'next') {
      return await this.next(...arguments, this.next)
    }
    return ret
  }
  /**
   * 执行下一个任务
   *
   * @returns
   * @memberof Chain
   */
  async next () {
    if (this.successor) {
      return await this.successor.start.apply(this.successor, arguments)
    }
  }
}

module.exports = Chain
